#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m, k, a[55][55], dp[55][55][15][15], mx[2] = {0, 1}, my[2] = {1, 0}; // 向右向下移动
ll p = 1e9 + 7;
ll dfs(int x, int y, int v, int w)// v:价值，w：数量
{
    if (x == n && y == m)//如果到终点，那么返回w是否等于k的逻辑值。
        return (ll)(w == k); 
    if (dp[x][y][v][w] != -1)//如果数组dp中索引为x、y、v、w的元素不等于-1，就返回该元素的值。如果条件不成立，则继续执行后面的代码。
        return dp[x][y][v][w]; // 已经走过了
    ll res = 0;
    for (int i = 0; i < 2; i++)
    {
        int nx = x + mx[i], ny = y + my[i]; // 移动
        if (nx < 1 || nx > n || ny < 1 || ny > m)
            continue; // 出界
        if (a[nx][ny] > v && w < k)//选大的加进去
            res = (res + dfs(nx, ny, a[nx][ny], w + 1)) % p;
        res = (res + dfs(nx, ny, v, w)) % p;
    }
    return dp[x][y][v][w] = res;
}
int main()
{
    memset(dp, -1, sizeof(dp));
    cin >> n >> m >> k;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            a[i][j]++;
        }

    cout << (dfs(1, 1, 0, 0) + dfs(1, 1, a[1][1], 1)) % p;//选或不选
    return 0;
}